package in.rob.client.page; import in.lib.Constants; import in.lib.Debug; import in.lib.adapter.PostAdapter; import in.lib.event.DeletePostEvent; import in.lib.event.NewPostEvent; import in.lib.handler.streams.ThreadResponseHandler; import in.lib.helper.ResponseHelper; import in.lib.manager.APIManager; import in.lib.manager.UserManager; import in.lib.utils.StringUtils; import in.model.Post; import in.rob.client.R; import in.rob.client.ThreadActivity; import in.rob.client.dialog.ReplyPostDialog; import in.rob.client.page.base.PostStreamFragment; import java.util.ArrayList; import lombok.Getter; import lombok.Setter; import android.content.Intent; import android.os.Bundle; import android.text.TextUtils; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import com.squareup.otto.Subscribe; public class ThreadPage extends PostStreamFragment { /** * The current center post in the thread view */ @Getter @Setter private Post centerPost; @Getter @Setter private String threadId = ""; @Override public void setupAdapters() { super.setupAdapters(); ((PostAdapter)getAdapter()).setReady(false); } @Override public void retrieveArguments(Bundle arguments) { super.retrieveArguments(arguments); if (arguments != null) { if (arguments.containsKey(Constants.EXTRA_POST)) { centerPost = (Post)arguments.getParcelable(Constants.EXTRA_POST); threadId = centerPost.getThreadId(); if (TextUtils.isEmpty(threadId)) { threadId = centerPost.getId(); } } else if (arguments.containsKey(Constants.EXTRA_POST_ID)) { threadId = arguments.getString(Constants.EXTRA_POST_ID); centerPost = new Post(); centerPost.setMachinePost(true); centerPost.setId(arguments.getString(Constants.EXTRA_POST_ID)); } if (arguments.containsKey(Constants.EXTRA_CENTER_POST_ID)) { centerPost = new Post(); centerPost.setMachinePost(true); centerPost.setId(arguments.getString(Constants.EXTRA_CENTER_POST_ID)); arguments.remove(Constants.EXTRA_CENTER_POST_ID); } } } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); onDataReady(); } @Override public void onDataReady() { // add the center post into the list if (centerPost != null && !centerPost.isMachinePost()) { threadId = centerPost.getThreadId(); if (getAdapter().indexOf(centerPost) < 0) { getAdapter().addItem(centerPost); } ((PostAdapter)getAdapter()).setCenter(centerPost); getAdapter().notifyDataSetChanged(); } } @Override public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3) { Post p = (Post)getAdapter().getItem(position - getListView().getHeaderViewsCount()); if (p != centerPost) { centerPost = p; ((ThreadActivity)getActivity()).setPost(centerPost); ((PostAdapter)getAdapter()).setCenter(centerPost); getAdapter().notifyDataSetChanged(); } } /** * Checks the adapter sizes and removes the appropriate headers */ @Override public void checkAdapterSizes() { try { if (getAdapter().getCount() - ((PostAdapter)getAdapter()).getCenterPosition() > 3) { getHeadedListView().removeFooterView(getPaddingView()); } } catch (Exception e) { Debug.out(e); } } @Override public void addDefaultFooters() { super.addDefaultFooters(); addPaddingView(); } @Override public void fetchStream(String lastId, boolean append) { if (!append && !isLoading()) { ThreadResponseHandler handler = new ThreadResponseHandler(getApplicationContext()); handler.setResponseKey(getResponseKeys()[0]); ResponseHelper.getInstance().addResponse(getResponseKeys()[0], handler, this); APIManager.getInstance().getPostThread(threadId, handler); } } /** * Get's the thread posts/replies * * Use this once at the start, and when the user forces a refresh. * Use {@link #fetchStream(String, boolean)} for pagination */ @Override public void beginLoadFromApi() { //fetchStream("", false); onForceRefresh(); } @Override public String getCacheFileName() { return null; } @Override public String[] getResponseKeys() { return new String[]{String.format(Constants.RESPONSE_THREAD, threadId)}; } @Subscribe @Override public void onPostRecieved(NewPostEvent event) { Post p = event.getPost(); if (p != null) { if (p.getThreadId().equals(threadId)) { ((PostAdapter)getAdapter()).appendItem(p); getAdapter().notifyDataSetChanged(); } } } @Subscribe @Override public void onPostDeleted(DeletePostEvent event) { super.onPostDeleted(event); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.menu_new_post) { replyAll(); return true; } return super.onOptionsItemSelected(item); } public void replyAll() { if (centerPost == null) return; ArrayList<String> participents = new ArrayList<String>(); for (int index = 0; index < getAdapter().getCount(); index++) { Post p = (Post)getAdapter().getItem(index); if (!participents.contains("@" + p.getPoster().getMentionName())) { participents.add("@" + p.getPoster().getMentionName()); } } if (participents.size() < 1) { participents.add("@" + UserManager.getUser().getMentionName()); } else { participents.remove("@" + UserManager.getUser().getMentionName()); } String participentsStr = StringUtils.join(participents, " "); Intent in = new Intent(getContext(), ReplyPostDialog.class); in.putExtra(Constants.EXTRA_POST_ID, centerPost.getId()); in.putExtra(Constants.EXTRA_TEXT, participentsStr); startActivityForResult(in, Constants.REQUEST_REPLY_POST); } @Override public void addLoadMoreView(){} @Override public void removeLoadMoreView(){} }